<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Redis;

class QueryIpStatus implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public $ip;

    public $tryTimes = 3;

    /**
     * Create a new job instance.
     *
     * @param $ip
     * @description 这里的ip参数是通过 QueryIpStatus::dispatch($ip); 传入的
     */
    public function __construct($ip)
    {
        $this->ip = $ip;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $count = 1;
        // 因为需要通过9次查询，且查询失败之后才判定失败，因此将该操作单独写成一个方法
        $this->query($count);
    }

    public function query($count)
    {
        // 判断操作系统，linux操作系统与windows操作系统ping出来的结果不同
        $os = php_uname('s');
        if ($os === 'Linux') {
            // ping 命令，只 ping 1 次
            $cmd = "ping -c 1 " . $this->ip;
            // exec函数百度下，有参数说明
            exec($cmd, $output, $return_val);
            // 这里分为两种情况，一种是ping成功了，成功后返回的数据是长度为5的数组，失败了是长度为6的数组
            if(count($output) === 5){
                $result = $output[3];
            }else{
                $result = $output[4];
            }
            // 根据字符串来判断ping是否成功，可以将QueryIpStatus::dispatch($ip)->onConnect('sync');改成同步操作
            // 然后dd($output); 来查看exec函数的执行结果
            $resultArr = explode(',', $result);
            if ($resultArr[1] === ' 1 received') {
                Redis::set($this->ip, implode(' ',$output));
            }else{
                if($count === $this->tryTimes){
                    Redis::set($this->ip, 'fail');
                    return;
                }
                $count++;
                $this->query($count);
            }
        } else {
            $cmd = "ping -n 1 " . $this->ip;
            exec($cmd, $output, $return_val);
            if(count($output) === 4){
                $result = $output[3];
            }else{
                $result = $output[4];
            }
            $resultArr = explode(',', $result);
            if ($resultArr[1] === '已接收 = 1') {
                Redis::set($this->ip, implode(' ',$output));
            }else{
                if($count === $this->tryTimes){
                    Redis::set($this->ip, 'fail');
                    return;
                }
                $count++;
                $this->query($count);
            }
        }
    }
}
